// 场景动画默认持续时间
const ANIMATION_DEFAULT_DURATION = 1000

export default class BaseScene extends Laya.Scene {
  constructor () {
    super()
  }

  // 场景打开回调
  onOpened (params) {
    console.log(this.url + '场景打开')

    // 记录参数
    this.params = params
    // 获取到参数后，激活脚本onMounted生命周期
    this.mapScript('onMounted')

    // 播放场景打开动画
    this.openAnimation(() => {
      // 动画播放完成后，激活脚本onActivated生命周期
      this.mapScript('onActivated')
    })
  }

  // 重写关闭函数，使其支持关闭动画
  close (type = null, callback = () => {}) {
    // 官方的关闭函数
    const closeHandler = () => {
      this.onClosed(type)
      if (this.autoDestroyAtClosed) {
        this.destroy()
      }
      else {
        this.removeSelf()
      }      
    }

    this.closeAnimation(() => {
      closeHandler()
      callback()
    })
  }

  // 场景关闭回调
  onClosed () {
    console.log(this.url + '场景关闭')
  }

  // 场景打开动画
  openAnimation (callback = () => {}) {
    // 场景打开动画默认是不开启的，要设置startAnimation为true才可以开启
    if (this.params && this.params.startAnimation) {
      this.alpha = 0
      Laya.Tween.to(this, { alpha: 1 }, ANIMATION_DEFAULT_DURATION, null, Laya.Handler.create(this, () => {
        callback()
      }))
    }
    else {
      callback()
    }
  }

  // 场景关闭动画
  closeAnimation (callback = () => {}) {
    // 场景关闭动画默认是不开启的，要设置closeAnimation为true才可以开启
    if (this.params && this.params.closeAnimation) {
      this.alpha = 1
      Laya.Tween.to(this, { alpha: 0 }, ANIMATION_DEFAULT_DURATION, null, Laya.Handler.create(this, () => {
        callback()
      }))
    }
    else {
      callback()
    }
  }

  // 遍历所有脚本，并执行指定的脚本生命周期
  mapScript (lifeKey = '') {
    // 获取所有脚本
    const scriptsList = this.getComponents(Laya.Script)
    if (scriptsList) {
      const len = scriptsList.length
      for (let i = 0; i < len; i++) {
        const script = scriptsList[i]
        if (script[lifeKey] && typeof script[lifeKey] === 'function') {
          script[lifeKey]()
        }
      }      
    }
  }
}